﻿using QuanLyGiaoVuDAL.DTO;
using QuanLyGiaoVuDAL.Repositories.DatabaseRepositories;
using QuanLyGiaoVuService.ReportServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QuanLyGiaoVuService.CommandServices
{
    public class MonHocReportService: IMonHocReportService
    {
        private IMonHocRepository _monHocRepository;
        public MonHocReportService(IMonHocRepository monHocRepository)
        {
            _monHocRepository = monHocRepository;
        }

        public IEnumerable<QuanLyGiaoVuDAL.DTO.MonHocDTO> GetAllMonHoc(Guid? maLop)
        {
            return _monHocRepository.GetAllMonHoc(maLop);
        }

        public QuanLyGiaoVuDAL.DTO.MonHocDTO GetMonHocById(Guid id)
        {
            return _monHocRepository.GetMonHocById(id);
        }


        public IEnumerable<QuanLyGiaoVuDAL.DTO.GiangVienDTO> GetAllGiangVienByMonHocId(Guid id)
        {
            return _monHocRepository.GetAllGiangVienByMonHocId(id);
        }

        public IEnumerable<QuanLyGiaoVuDAL.DTO.MonHocDTO> SapXepMonHoc(IEnumerable<MonHocDTO> danhSachMonHoc)
        {
            List<MonHocDTO> dsMonHocBanDau = danhSachMonHoc.OrderBy(monHoc => monHoc.HocKy).ToList();
            List<MonHocDTO> dsDaSapXep = dsMonHocBanDau.Where(monHoc => monHoc.MaMonChinh == null).ToList();
            dsMonHocBanDau = dsMonHocBanDau.Where(monHoc => monHoc.MaMonChinh != null).ToList();
            List<MonHocDTO> dsMonHocDaXoa = new List<MonHocDTO>();
            foreach (var monHoc in dsMonHocBanDau)
            {
                int index = dsDaSapXep.FindIndex(mh => mh.ID == monHoc.MaMonChinh);
                if (index > -1)
                {
                    dsDaSapXep.Insert(index + 1, monHoc);
                    dsMonHocDaXoa.Add(monHoc);
                }
            }
            foreach (var monHoc in dsMonHocDaXoa)
            {
                dsMonHocBanDau.Remove(monHoc);
            }

            dsDaSapXep.AddRange(dsMonHocBanDau);
            return dsDaSapXep;
        }


        public IEnumerable<MonHocDTO> GetAllMonHocKhongThuocChuongTrinhKhung(Guid? maLop)
        {
            var dsTatCaMonHoc = _monHocRepository.GetAllMonHoc(null);
            var dsMonHocThuocCTK = _monHocRepository.GetAllMonHoc(maLop);
            List<MonHocDTO> result = dsTatCaMonHoc.ToList();
            foreach (var monHoc in dsMonHocThuocCTK)
            {
                int index = result.FindIndex(mh => mh.ID == monHoc.ID);
                if (index >= 0)
                    result.RemoveAt(index);
            }
            return result;
        }


        public IEnumerable<MonHocDTO> GetAllMonHocByBoMon(int maBoMon)
        {
            return _monHocRepository.GetAllMonHocByBoMon(maBoMon);
        }


        public IEnumerable<MonHocDTO> GetAllMonHocKhongThuocBoMon(int maBoMon)
        {
            var dsTatCaMonHoc = _monHocRepository.GetAllMonHoc(null);
            var dsMonHocThuocBoMon = _monHocRepository.GetAllMonHocByBoMon(maBoMon);
            List<MonHocDTO> result = dsTatCaMonHoc.ToList();
            foreach (var monHoc in dsMonHocThuocBoMon)
            {
                int index = result.FindIndex(mh => mh.ID == monHoc.ID);
                if (index >= 0)
                    result.RemoveAt(index);
            }
            return result;
        }
    }
}
